package com.base.cn.platform.os.service.manage.config;

import com.base.cn.platform.os.common.constants.CacheConstants;
import com.base.cn.platform.os.common.j2cache.CustomCacheChannel;
import com.base.cn.platform.os.common.j2cache.J2CacheRegion;
import com.base.cn.platform.os.common.mybatis.BaseBiz;
import com.base.cn.platform.os.common.utils.DataUtil;
import com.base.cn.platform.os.common.utils.ObjectUtils;
import com.base.cn.platform.os.common.utils.StringUtils;
import com.base.cn.platform.os.dao.manage.config.SysLinkConfigDao;
import com.base.cn.platform.os.entity.manage.config.SysLinkConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 链接配置Biz
 *
 * @author s.li
 * @create 2018-04-10-18:38
 */
@Service
public class SysLinkConfigBiz extends BaseBiz<SysLinkConfig,SysLinkConfigDao> {
    @Autowired
    private CustomCacheChannel customCacheChannel;
    /**
     * 保存链接配置数据
     * @param sysLinkConfig 链接配置内容对象
     * @return 保存后的链接配置内容对象
     */
    public SysLinkConfig saveSysLinkConfig(SysLinkConfig sysLinkConfig){
        if(DataUtil.idIsNotNull(sysLinkConfig.getId())){//修改
            this.updateById(sysLinkConfig,null);
        }else{//添加
            sysLinkConfig.setStatus(1);
            this.save(sysLinkConfig);
        }
        customCacheChannel.evict(J2CacheRegion.SEVEN_DAY_REGION.getKey(),CacheConstants.WEB_LINK_CONFIG);
        return sysLinkConfig;
    }

    /**
     * 多条件查询链接配置内容
     * @param sysLinkConfig 查询条件
     * @return  List<SysLinkConfig>
     */
    public List<SysLinkConfig> findSysLinkConfig(SysLinkConfig sysLinkConfig){
        StringBuilder whereSql = new StringBuilder(" 1=1");
        if(ObjectUtils.isNotEmpty(sysLinkConfig)){
            if(StringUtils.isNotEmpty(sysLinkConfig.getLinkName())){
                whereSql .append(" and linkName like '%").append(sysLinkConfig.getLinkName().trim()).append("%'");
            }
            if(ObjectUtils.isNotEmpty(sysLinkConfig.getStatus())){
                whereSql .append(" and status = ").append(sysLinkConfig.getStatus());
            }
            if(StringUtils.isNotEmpty(sysLinkConfig.getLinkType())){
                whereSql .append(" and linkType='").append(sysLinkConfig.getLinkType().trim()).append("'");
            }
        }
        whereSql .append(" order by sort asc");
        //查询导航列表
        List<SysLinkConfig> sysLinkConfigList = this.find(whereSql.toString(),null,null);
        //处理分层
        sysLinkConfigList = handleLayered(sysLinkConfigList);
        return sysLinkConfigList;
    }

    /**
     * 前台获取链接配置接口
     * @return Map<String,List<SysLinkConfig>>
     */
    public Map<String,List<SysLinkConfig>> findWebLinkMapList(){
        Map<String,List<SysLinkConfig>> sysLinkConfigListMap = (Map<String,List<SysLinkConfig>>)customCacheChannel.get(J2CacheRegion.SEVEN_DAY_REGION.getKey(),CacheConstants.WEB_LINK_CONFIG).getValue();
        if(sysLinkConfigListMap==null){
            SysLinkConfig sysLinkConfig = new SysLinkConfig();
            sysLinkConfig.setStatus(1);
            List<SysLinkConfig> linkConfigList = this.findSysLinkConfig(sysLinkConfig);
            if(ObjectUtils.isNotEmpty(linkConfigList)){
                sysLinkConfigListMap = linkConfigList.stream().collect(Collectors.groupingBy(e->e.getLinkType()));
                customCacheChannel.set(J2CacheRegion.SEVEN_DAY_REGION.getKey(),CacheConstants.WEB_LINK_CONFIG,sysLinkConfigListMap);
            }
        }
        return sysLinkConfigListMap;
    }

    /**
     * 修改链接状态
     * @param ids ID串
     */
    public void updateSysLinkConfigStatus(String ids, int status){
        if(StringUtils.isNotEmpty(ids)){
            ids = StringUtils.subHeadTailString(ids,",");
            if(StringUtils.isNotEmpty(ids)){
                if(status ==3){
                    this.deleteWhereSql(" id in ("+ids+") or parentId in ("+ids+")");
                }else{
                    SysLinkConfig sysLinkConfig = new SysLinkConfig();
                    sysLinkConfig.setStatus(status);
                    this.updateByWhereSql(sysLinkConfig," id in ("+ids+")");
                }
            }
            customCacheChannel.evict(J2CacheRegion.SEVEN_DAY_REGION.getKey(),CacheConstants.WEB_LINK_CONFIG);
        }
    }

    /**
     * 处理分层
     * @param sysLinkConfigList 导航列表
     */
    private List<SysLinkConfig> handleLayered(List<SysLinkConfig> sysLinkConfigList){
        if(ObjectUtils.isNotEmpty(sysLinkConfigList)){
            Map<BigDecimal,List<SysLinkConfig>> sysLinkConfigListMap = sysLinkConfigList.stream().collect(Collectors.groupingBy(e->e.getParentId()));
            List<SysLinkConfig> parentList = sysLinkConfigListMap.get(BigDecimal.ZERO);
            if(ObjectUtils.isNotEmpty(parentList)){
                parentList.forEach(e->{
                    List<SysLinkConfig> childList = sysLinkConfigListMap.get(e.getId());
                    e.setChildLinkConfigList(childList);
                });
            }
            return parentList;
        }
        return null;
    }

}
